package preliminaire;

import java.math.BigInteger;

public class CyclicGroupElement extends BigInteger
{
	private static final long serialVersionUID = 1L;
	private BigInteger groupeOrder;
	
	public CyclicGroupElement(String val, BigInteger groupeOrder) 
	{
		super(val);
		this.groupeOrder = groupeOrder;
	}
	
	public BigInteger add(BigInteger val)
	{
		super.add(val);
		return this.mod(groupeOrder);
	}
	
	public BigInteger subtract(BigInteger val)
	{
		super.subtract(val);
		return this.mod(groupeOrder);
	}
	
	public BigInteger multiply(BigInteger val)
	{
		super.multiply(val);
		return this.mod(groupeOrder);
	}
	
	public BigInteger divide(BigInteger val)
	{
		super.divide(val);
		return this.mod(groupeOrder);
	}
	
	public BigInteger pow(int exponent)
	{
		super.pow(exponent);
		return this.mod(groupeOrder);
	}
	
	public BigInteger invert()
	{
		return super.modInverse(groupeOrder);
	}
	
	public BigInteger ordre()
	{
		BigInteger m = new BigInteger("0");
		BigInteger result = new BigInteger("0");
		
		while(!result.equals(ONE))
		{
			m = m.add(ONE);
			result = super.modPow(m, groupeOrder);
		}
		return m;
	}
	
	public BigInteger getGroupOrder() 
	{
		return groupeOrder;
	}
	
}
